package cn.xrj.file.controller;

import cn.xrj.file.filetool.FileCompression;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

@RestController
@RequestMapping("/file")
public class FileCompressionController {

    //压缩指定的某个目录，目录下所有文件全部打包压缩
    @GetMapping("/zipFile")
    public void zipFile() throws IOException {
        //这个是文件夹的绝对路径，如果想要相对路径就自行了解写法
        String sourceFile = "C:"+File.separator+"Users"+File.separator+"Administrator"+File.separator+"Desktop"+File.separator+"ggggg";
        //这个是压缩之后的文件绝对路径
        FileOutputStream fos = new FileOutputStream(
                "D:"+File.separator+"压缩文件测试.zip");
        ZipOutputStream zipOut = new ZipOutputStream(fos);
        File fileToZip = new File(sourceFile);
        System.out.println(fileToZip.getName());
        zipFile(fileToZip, fileToZip.getName(), zipOut);
        zipOut.close();
        fos.close();
    }

    private void zipFile(File fileToZip, String fileName, ZipOutputStream zipOut) throws IOException {
        //此处使用File的isHidden方法来检查要压缩的文件是否被隐藏
        if (fileToZip.isHidden()) {
            return;
        }
        //判断是否是文件夹
        if (fileToZip.isDirectory()) {//是文件夹
            //判断文件名是否以/结尾
            if (fileName.endsWith("/")) {//如果是以/结尾，则直接放入压缩条目
                zipOut.putNextEntry(new ZipEntry(fileName));
                zipOut.closeEntry();
            } else {//否则文件名后加/再将其放入压缩条目
                zipOut.putNextEntry(new ZipEntry(fileName + "/"));
                zipOut.closeEntry();
            }
            //遍历文件夹中的文件
            File[] children = fileToZip.listFiles();
            //递归遍历，一层一层将里面所有文件放入压缩条目
            for (File childFile : children) {
                zipFile(childFile, fileName + "/" + childFile.getName(), zipOut);
            }
            return;
        }
        //下面进行压缩操作,写操作
        FileInputStream fis = new FileInputStream(fileToZip);
        ZipEntry zipEntry = new ZipEntry(fileName);
        zipOut.putNextEntry(zipEntry);
        byte[] bytes = new byte[1024];
        int length;
        while ((length = fis.read(bytes)) >= 0) {
            zipOut.write(bytes, 0, length);
        }
        fis.close();
    }
}
